# coding=utf-8
class ConfigBase(object):

    @classmethod
    def create(cls):
        """
        加载配置并且创建配置实例。
        :rtype: ConfigBase
        """
        raise NotImplementedError('method not implemented')

    def persistence(self):
        """
        存储当前配置。
        """
        raise NotImplementedError('method not implemented')

    @staticmethod
    def getKey():
        """
        获取配置存储键名。
        :rtype: bool
        """
        raise NotImplementedError('method not implemented')

    @staticmethod
    def isGlobal():
        """
        判断是否为全局配置，仅在客户端配置中需要实现。
        :rtype: bool
        """
        raise NotImplementedError('method not implemented')

    def serialize(self):
        """
        将当前配置转换为字典形式，方便保存与传输。
        :rtype: dict
        """
        return self.__dict__

    def deserialize(self, data):
        """
        从字典更新当前配置，只更新当前实例中已存在且类型相同的配置。
        :param dict data: 字典数据
        """
        default = object()
        for key, value in data.items():
            current = getattr(self, key, default)
            if current is not default and type(value) == type(current):
                setattr(self, key, value)
